python操作Oracle数据库,你学会了吗?
1. 准备工作
① 首先,你必须安装好Oracle数据库。Oracle数据库的安装并不是那么容易,大家可以去找一个安装教程,慢慢研究。
② 其次,你既然用Python操作Oracle,你必须要安装Python吧。Python的安装过程较为简单。但是有一点需要注意:一定要安装64位的Python,不要使用32位的。
③ 最后,也是最复杂的一步。我们需要进行instantclient的下载安装和环境配置,它是oracle数据库的客户端,这个最好也是下载64位的。
2. instantclient的安装与配置
1)instantclient的下载地址
在进行instantclient的安装与配置之前,我先提供给大家一个下载链接,供大家下载,我们直接下载像11或者12这样的高版本,即可。
instantclient的下载地址:http://suo.im/5Dlqrr
2)instantclient的安装
① 直接解压instantclient安装包;
② 解压后的文件位置,不要随意放置;
我们需要将instantclient安装包,解压后得到的文件夹,放置在Oracle安装目录下的product的直接字目录下。
3)instantclient的环境配置
① 按照图中操作,完成环境变量的配置;
② 将其解压目录下的oraociei11.dll、oraocci11.dll、oci.dll文件复制到python安装目录的Lib/site-packages文件夹下;
instantclient安装包解压后的文件夹:
python安装目录下的Lib/site-packages文件夹:
3. 其他需要特别注意的点
1)解决中文乱码问题
当使用Python读取到Oracle数据库中的某张表,如果该表中存在中文,会出现中文乱码的问题。因此需要设置NLS_LANG环境变量,来解决这个问题,下面提供了两种方式。
① 打开CMD黑窗口,输入以下命令;
C:\Users\AA>set nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
② 直接在写代码的时候,输入以下命令;
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
注意: 上述两种方式书写命令的位置不同,不要弄错了。其次,上述设置NLS_LANG环境变量的方式,仅对当前窗口有效。其实,我们也可以永久修改NLS_LANG环境变量,但是请不要这么做。
2)关于cx_Oracle驱动包的安装,需要注意的问题
cx_Oracle是Python操作Oracle数据库,需要使用的驱动包。类似于Python操作MySQL使用的pymysql驱动包。
对于我来说,我直接使用下面这个命令,就安装成功:
pip insatll cx_Oracle
如果你的系统环境,导致安装失败,我这里提供两个链接,供你下载和学习:
cx_Oracle驱动包的下载:http://suo.im/6fGFSR
cx_Oracle安装教程:http://suo.im/5DlvxT
4. Python与Oracle交互操作
其实Python操作Oracle数据库,和Python操作MySQL数据库,基本上都是一样的道理,一通百通。我之前已经写了一个Python操作MySQL数据库的详细教程,下面提供给大家这个链接。
Python操作MySQL数据库:http://suo.im/6fGJhl
1)Python链接Oracle服务器的3种方式
① 用户名、密码和监听写在一起
import cx_Oracle
db = cx_Oracle.connect('scott/a123456@DESKTOP-V4LKB10:1521/orcl')
② 用户名、密码和监听分开写
import cx_Oracle
db = cx_Oracle.connect("scott","a123456","192.168.2.1:1521/orcl")
③ 配置监听并连接
import cx_Oracle
moniter = cx_Oracle.makedsn('192.168.2.1',1521,'orcl')
db = cx_Oracle.connect('scott','a123456',moniter)
2)Python怎么获取Oracle中的数据(查)
数据分析师日常工作用到最多的就是“查”,因此我们只讲述怎么查数据。关于其它的增删改操作,都是类似于MySQL,这里就不详细说明。
① fetchone():一次获取一条记录;
import cx_Oracle
# 注意:一定要加下面这两行代码,负责会中文乱码;
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
db = cx_Oracle.connect("scott","a123456","192.168.2.1:1521/orcl")
cursor = db.cursor()
cursor.execute('select count(*) from emp1')
aa = cursor.fetchone()
print(aa)
cursor.execute('select ename,deptno,sal from emp1')
for i in range(aa[0]):
a,b,c = cursor.fetchone()
d = "我的名字叫{},所在部门是{},工资是{}美元".format(a,b,c)
display(d)
db.close()
截取部分结果如下:
② fetchall():一次获取所有记录;
import cx_Oracle
# 注意:一定要加下面这两行代码,负责会中文乱码;
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
db = cx_Oracle.connect("scott","a123456","192.168.2.1:1521/orcl")
cursor = db.cursor()
cursor.execute('select ename,deptno,sal from emp1')
aa = cursor.fetchall()
# print(aa)
for a,b,c in aa:
d = "我的名字叫{},所在部门是{},工资是{}美元".format(a,b,c)
display(d)
db.close()
截取部分结果如下:
③ 使用pandas中的read_sql()方法,将提取到的数据直接转化为DataFrame进行操作;
import cx_Oracle
import pandas as pd
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
db = cx_Oracle.connect("scott","a123456","192.168.2.1:1521/orcl")
cursor = db.cursor()
df1 = pd.read_sql("select * from emp where deptno=20",db)
display(df1)
df2 = pd.read_sql("select * from emp where deptno=30",db)
display(df2)
结果如下:
关注微信公众号『数据分析与统计学之美』,后台回复"入群" 拉你进群哦,气氛很好滴呀!